﻿// xdatabase.cpp 
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include "xdatabase.h"
#include "tools.h"
using namespace std;

//1 学完后面代码后,用面向对象封装,并考虑支持多线程处理任务
//2 支持用map存放数据 
//3 支持创建表格 每个表达里面还是存放key value,存放方式可以设置为线性表vector还是树结构的map
//4 支持持久化,数据缓存入文件 
// 
//写作业流程
// 一 完全自己独立完成
// 二 查找资料完成
// 三 询问老师或者同学不理解的细节
// 四 看老师提供的作业代码
// 五 看老师的讲解视频
// 六 扩展优化作业内容,再与老师同学交流
static bool is_exit = false;
//存放关键字
static vector<string> keys;
static vector<string> datas;
bool StartXDataBase(int argc, char* argv[])
{
	while (!is_exit)
	{
		//提示用户输入
		cout << "xdb>>" << flush;
		string cmd;
		//接收用户输入的一行命令
		getline(cin, cmd);

		//分割好的命令
		vector<string> paras = SplitTrimString(cmd);
		if (paras.empty())continue;
		//insert 关键字 值
		string type = paras[0];

		//支持大小写混用
		//大小写转换可以用函数toupper,这里写循环处理
		ToUpper(type);
		//cout << type << endl;

		if (type == "exit" || type == "quit")
		{
			is_exit = true;
			break;
		}
		else if (type == "insert")
		{
			if (paras.size() != 3)
			{
				cerr << "请输入正确的key和value" << endl;
				continue;
			}
			const string& key = paras[1];
			std::string data = paras[2];
			if (!SetData(key, data))
			{
				if (!InsertData(key, data))
				{
					cout << "数据存储失败" << endl;
					continue;
				}
			}
			cout << "数据存储成功" << endl;
			
		}
		else if (type == "delete")
		{
			if (paras.size() != 2)
			{
				cerr << "请输入正确的key" << endl;
				continue;
			}
			const string& key = paras[1];
			if (DeleteData(key))
			{
				cout << "key:" << key << "删除成功!" << endl;
			}
			else
			{
				cout << "key:" << key << "数据不存在!" << endl;
			}
		}
		else if (type == "select")
		{
			if (paras.size() != 2)
			{
				cerr << "请输入正确的key" << endl;
				continue;
			}
			const string& key = paras[1];
			string data;
			if (!GetData(key, data))
			{
				cout << "key:" << key << "数据不存在!" << endl;
				continue;
			}
			cout << data << endl;
				
		}
		else
		{
			cerr << type << " \033[44m 命令不支持 \033[0m" << endl;
		}
	}
	return true;
}
void StopXDataBase()
{
	is_exit = true;
}

bool SetData(std::string key, std::string data)
{
	auto f = find(keys.begin(), keys.end(), key);
	if (f == keys.end())
	{
		return false;
	}
	int index = f - keys.begin();
	datas[index] = move(data);
	return  true;
}
bool InsertData(std::string key, std::string data)
{
	keys.push_back(key);
	datas.push_back(move(data));
	return true;
}
bool DeleteData(std::string key)
{
	auto f = find(keys.begin(), keys.end(), key);
	if (f == keys.end())
		return false;
	int index = f - keys.begin();
	keys.erase(f);
	datas.erase(datas.begin() + index);
	return true;

}

bool GetData(std::string key, std::string& data)
{
	auto f = find(keys.begin(), keys.end(), key);
	if (f == keys.end())
		return false;
	int index = f - keys.begin();
	data = datas[index];
	return true;
}